#ifndef TCPAPPENDER_H
#define TCPAPPENDER_H

#include <QTcpSocket>
#include <QRecursiveMutex>
#include <QStringConverter>
#include "baseappender.h"


// 输出内容到网络TCP
// 1. 支持设置输出等级
// 2. 支持设置远程服务器IP和端口
// 3. 自动维护TCP连接（断开时尝试重连）
class TcpAppender : public BaseAppender
{
    Q_OBJECT
public:
    // 构造函数：指定日志级别、远程IP和端口
    TcpAppender(LogLevel level,
                QString strRemoteIp = "127.0.0.1",
                quint16 nRemotePort = 9009,
                QObject* parent = nullptr);

    ~TcpAppender();

    void setRemoteAddr(QString strIp, quint16 nPort);// 设置远程服务器地址和端口（会自动重新连接）
    void append(LogLevel level, const QString& msg) override;// 重写append：发送日志到TCP服务器（确保连接状态）

    // 新增：设置缓存重试参数
    void setRetryConfig(int maxRetry = 3, int retryInterval = 2000);
    // 新增：设置编码格式
    void setEncoding(QStringConverter::Encoding encoding);

private slots:
    void onConnected();     // 处理连接成功事件
    void onDisconnected();  // 处理连接断开事件
    void onErrorOccurred(QAbstractSocket::SocketError error);// 处理错误事件

    // 新增：处理数据发送完成信号
    void onBytesWritten(qint64 bytes);
    // 新增：定时重试发送缓存
    void retrySendCache();

private:
    void initTcpSocket();
    // 重连改为非阻塞（无返回值）
    void reconnect();
    // 新增：发送缓存中的数据
    void sendCache();
    // 新增：将字符串按指定编码转换为字节数组
    QByteArray encodeString(const QString& str);

private:
    QTcpSocket* m_tcpSocket=nullptr;       // TCP socket对象
    QString m_RemoteIp="127.0.0.1";// 远程服务器IP
    quint16 m_RemotePort=9009;     // 远程服务器端口
    bool m_isConnected=false;      // 连接状态标志
    QRecursiveMutex m_mutex;                // 线程安全锁（多线程操作socket）

    // 新增：缓存相关
    QList<QByteArray> m_logCache;       // 日志缓存队列
    bool m_isSending=false;             // 标记是否正在发送中
    int m_maxRetry=3;                   // 最大重试次数
    int m_retryInterval=2000;           // 重试间隔（毫秒）
    int m_currentRetryCount=0;          // 当前重试计数
    // 存储编码格式（默认系统编码）
    QStringConverter::Encoding m_encoding = QStringConverter::System;
};

#endif // TCPAPPENDER_H
